package com.example.tk1_19;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
// 类MainActivity实现了接口View.OnClickListener，MainActivity也是一个按键事件监听器
public class MainActivity extends AppCompatActivity  implements View.OnClickListener  {
    TextView tv_state;//用于显示连接状态的文本框，包括：已连接和网络断开 2种状态
    EditText ip_edit; //用于引用IP地址编辑框
    EditText ip_port; //用于引用端口号编辑框
    Button bt_connect;//用于引用连接按钮
    Button bt_close;//用于引用关闭按钮

    //设定温度确定按钮  设定湿度确定按钮
    Button  bt_wd,  bt_sd;


    String ip;  //用于存储IP地址
    int port;  //用于存储端口号
    Socket ss;  //网络通信使用的Socket

    DataOutputStream dataOutputStream=null;//网络通信使用的数据输出流，用于发送指令



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv_state=(TextView)this.findViewById(R.id.tv_state);
        //任务3_1 ：根据组件id号R.id.ip_edit查找IP地址编辑框EditText组件的引用，使用变量ip_edit保存

        ip_edit=(EditText) this.findViewById(R.id.ip_edit);

        //结束任务3_1
        ip_port=(EditText)this.findViewById(R.id.ip_port);

        bt_connect=(Button)this.findViewById(R.id.bt_connect);
        bt_close=(Button)this.findViewById(R.id.bt_close);

        bt_wd=(Button)this.findViewById(R.id.bt_wd);
        bt_sd=(Button)this.findViewById(R.id.bt_sd);

        bt_connect.setOnClickListener(this);
        bt_close.setOnClickListener(this);

        bt_wd.setOnClickListener(this);
        bt_sd.setOnClickListener(this);

    }

    //连接服务器
    void connectToServer()
    {
        //任务3_2 ：从IP地址编辑框ip_edit获取IP地址并保存到变量ip
        ip=ip_edit.getText().toString().trim();

        //结束任务3_2
        port= Integer.parseInt(ip_port.getText().toString().trim());


        new Thread(new Runnable(){
            @Override
            public void run() {
                //连接网路，如果不产生异常，说明连接成功，设置tv_state文本为已连接
                try {
                    //任务3_3 ：实现建立Socket网络连接和数据输出流DataOutputStream。
                    ss=new Socket(ip,port);

                    //结束任务3_3
                    //数据输出流DataInputStream
                    dataOutputStream=new DataOutputStream(ss.getOutputStream());

                    MainActivity.this.runOnUiThread(new Runnable() {
                        @Override
                        public void run() {

                            //任务3_4 ：实现文本框tv_state显示为"已连接"状态

                            tv_state.setText("已连接");

                            //结束任务3_4
                        }

                    });

                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
        }).start();
    }
    //关闭连接
    void closeConnect()
    {
        try {
            ss.close();
            tv_state.setText("网络断开");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //发送增加温度指令，发送设定增加1度的控制指令串55 BB 00 08 01 01
    void addWD()
    {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    // 根据发送指令格式，发送增加温度指令，如：发送设定增加1度的控制指令串55 BB 00 08 01 01
                    byte zl[]=new byte[]{(byte)0x55,(byte)0xBB,(byte)0x00,(byte)0x08,(byte)0x03,(byte)0x24};
                    dataOutputStream.write(zl);  // 写指令,即发送指令

                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
        }).start();
    }

    //发送设置温度指令，发送设定36度的控制指令串55 BB 00 08 03 24
    void setWD()
    {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    //任务3_5 ：根据发送指令格式，发送设定温度指令指令，如：发送设定36度的控制指令串55 BB 00 08 03 24
                    byte zl[]=new byte[]{(byte)0x55,(byte)0xBB,(byte)0x00,(byte)0x08,(byte)0x03,(byte)0x24};
                    dataOutputStream.write(zl);  // 写指令,即发送指令
                    //结束任务3_5
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
        }).start();
    }
    //发送设置湿度指令 发送设定68%相对湿度的控制指令串 55 BB 00 09 03 44
    void setSD()
    {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    //任务3_6 ： 根据发送指令格式，发送设定相对湿度指令指令，如：发送设定68%相对湿度的控制指令串 55 BB 00 09 03 44
                    byte zl[]=new byte[]{(byte)0x55,(byte)0xBB,(byte)0x00,(byte)0x09,(byte)0x03,(byte)0x44};
                    dataOutputStream.write(zl);  // 写指令,即发送指令
                    //结束任务3_6
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
        }).start();
    }

    //按键处理
    @Override
    public void onClick(View view) {


        switch(view.getId())  //获得组件ID号，根据按键ID号调用不同按键处理函数
        {
            case R.id.bt_connect:  //连接按钮
                connectToServer();
                break;
            case R.id.bt_close:  //关闭连接按钮
                closeConnect();
                break;

            case  R.id.bt_wd://设定温度按钮
                setWD();
                break;
            case  R.id.bt_sd://设定湿度按钮
                setSD();
                break;
        }

    }
}